package com.zy.gateway.zuul.filter;

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import org.springframework.cloud.netflix.zuul.filters.support.FilterConstants;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;

import javax.servlet.http.HttpServletRequest;

@Component
public class GlobalFilter extends ZuulFilter {

    /*
    设置过滤类型
     */
    @Override
    public String filterType() {
        return FilterConstants.PRE_TYPE;
    }

    /*
    设置过过滤器优先级

    zuul自带的几个过滤器执行顺序如下：
    1、pre过滤器
    ServletDetectionFilter  -3      --最先被执行的过滤器，主要用来检测当前请求是通过Spring的DispatcherServlet处理运行的，还是通过ZuulServlet来处理运行的
    Servlet30WrapperFilter  -2      --是第二个执行的过滤器，主要为了将原始的HttpServletRequest包装成Servlet30RequestWrapper对象
    FormBodyWrapperFilter   -1      --是第三个执行的过滤器，主要目的是将符合要求的请求体包装成FormBodyRequestWrapper对象
    DebugFilter              1      --是第四个执行的过滤器，该过滤器会根据配置参数zuul.debug.request和请求中的debug参数来决定是否执行过滤器中的操作
    PreDecorationFilter      5      --是pre阶段最后被执行的过滤器，该过滤器会判断当前请求上下文中是否存在forward.do和serviceId参数，如果都不存在，那么它就会执行具体过滤器的操作

    2、route过滤器
    RibbonRoutingFilter      10     --是route阶段的第一个执行的过滤器，它通过使用ribbon和hystrix来向服务实例发起请求，并将服务实例的请求结果返回
    SimpleHostRoutingFilter  100    --是route阶段的第二个执行的过滤器，该过滤器的执行逻辑就是直接向routeHost参数的物理地址发起请求
    SendForwardFilter        500    --是route阶段第三个执行的过滤器，用来处理路由规则中的forward本地跳转装配

    3、post过滤器
    SendErrorFilter          0      --是post阶段的第一个执行的过滤器，该过滤器的具体逻辑就是利用上下文中的错误信息来组成一个forward到api网关/error错误端点的请求来产生错误响应
    SendResponseFilter       1000   --是post阶段最后执行的过滤器，该过滤器的处理逻辑就是利用上下文的响应信息来组织需要发送回客户端的响应内容
     */
    @Override
    public int filterOrder() {
        return -4;
    }

    /*
    是否需要过滤
     */
    @Override
    public boolean shouldFilter() {
        return true;
    }

    @Override
    public Object run() throws ZuulException {
        RequestContext context = RequestContext.getCurrentContext();
        HttpServletRequest request = context.getRequest();
        /*String token = request.getHeader("token");
        if (StringUtils.isEmpty(token)) {
            //返回错误信息
            context.setResponseStatusCode(HttpStatus.UNAUTHORIZED.value());
            context.setResponseBody(HttpStatus.UNAUTHORIZED.getReasonPhrase());
            context.setSendZuulResponse(false);
            return null;
        }*/
        String id = request.getParameter("id");
        if (StringUtils.isEmpty(id)) {
            context.setResponseStatusCode(HttpStatus.FORBIDDEN.value());
            context.setResponseBody(HttpStatus.FORBIDDEN.getReasonPhrase());
            //是否将response发送给客户端，默认为true
            context.setSendZuulResponse(false);
        }
        return null;
    }
}
